#ifndef _PUBLIC_H
#define _PUBLIC_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <dirent.h>
#include <dirent.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <sys/types.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <stdbool.h>
#include <sys/select.h>
#include <sys/time.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <errno.h>
#include <signal.h>
#include <pthread.h>
#include <math.h>
#include <ctype.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/epoll.h>
#include <sys/sendfile.h>

// 命令行参数检查的宏函数
#define ARGS_CHECK(argc,expected) \
    do { \
        if(argc != expected) \
        { \
            fprintf(stderr,"args num error,please set %d args\n",expected);\
            exit(-1); \
        }\
    } while(0);
struct dirent;

// 用于检查函数返回值是否是错误标记，并且进行相应的错误处理
#define ERROR_CHECK(ret,error_flag,msg) \
    do \
{ \
    if((ret) == (error_flag)){ \
        perror(msg); \
        exit(-1); \
    } \
} while(0)

// 用于检查pthread_*开头函数是否错误标记，并进行相应的错误处理
#define THREAD_ERROR_CHECK(ret,msg) {if(ret!=0){fprintf(stderr,"%s:%s\n",msg,strerror(ret));}}

// 求数组长度宏函数
#define COUNT_OF(arr) (sizeof(arr)/sizeof(0[arr]))

/*
 *description:
 *      将动态内存分配的空间释放，并将该指针置空
 *paras:
 *      ptr         指向动态内存分配空间的指针
 * */
#define FREE_AND_NULLIFY(ptr) do { \
    if ((ptr) != NULL) { \
        free(ptr); \
        (ptr) = NULL; \
    } \
} while (0)

#endif

